package com.autoglm.data.repository

import com.autoglm.data.model.GLMChatRequest
import com.autoglm.data.model.GLMChatResponse
import com.autoglm.data.model.GLMMessage
import com.autoglm.data.remote.GLMApiService
import com.autoglm.utils.Constants
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import javax.inject.Inject
import javax.inject.Singleton

/**
 * GLM模型仓库
 * 负责与GLM API的交互
 */
@Singleton
class GLMRepository @Inject constructor(
    private val apiService: GLMApiService
) {
    
    /**
     * 发送聊天消息
     */
    suspend fun sendMessage(
        messages: List<GLMMessage>,
        temperature: Double = 0.7,
        maxTokens: Int = 2048
    ): Result<GLMChatResponse> {
        return try {
            val request = GLMChatRequest(
                model = Constants.GLM_MODEL_NAME,
                messages = messages,
                temperature = temperature,
                max_tokens = maxTokens
            )
            
            val response = apiService.chatCompletion(
                authorization = "Bearer ${Constants.GLM_API_KEY}",
                request = request
            )
            
            if (response.isSuccessful) {
                response.body()?.let { 
                    Result.success(it)
                } ?: Result.failure(Exception("Empty response body"))
            } else {
                Result.failure(Exception("API error: ${response.code()} ${response.message()}"))
            }
        } catch (e: Exception) {
            Result.failure(e)
        }
    }
    
    /**
     * 理解用户指令
     */
    suspend fun understandUserIntent(userInput: String): Result<String> {
        return try {
            val systemPrompt = """
                你是一个专业的任务理解助手，专门帮助用户将自然语言指令转换为可执行的任务步骤。
                
                请分析用户的指令，提取关键信息：
                1. 目标应用
                2. 具体操作
                3. 参数信息
                4. 预期结果
                
                用户指令：$userInput
                
                请以JSON格式返回分析结果，包含：
                - intent: 主要意图
                - targetApp: 目标应用
                - actions: 操作列表
                - parameters: 参数信息
                - expectedResult: 预期结果
            """.trimIndent()
            
            val messages = listOf(
                GLMMessage(role = "system", content = systemPrompt),
                GLMMessage(role = "user", content = userInput)
            )
            
            val result = sendMessage(messages, temperature = 0.3)
            result.map { response ->
                response.choices.firstOrNull()?.message?.content ?: ""
            }
        } catch (e: Exception) {
            Result.failure(e)
        }
    }
    
    /**
     * 规划任务步骤
     */
    suspend fun planTaskSteps(userInput: String, targetApp: String): Result<String> {
        return try {
            val systemPrompt = """
                你是一个专业的任务规划助手，专门为Android应用操作制定详细的执行步骤。
                
                请为以下任务制定详细的执行步骤：
                用户指令：$userInput
                目标应用：$targetApp
                
                请以JSON格式返回任务规划，包含：
                - taskId: 任务ID
                - description: 任务描述
                - steps: 步骤列表，每个步骤包含：
                  - stepNumber: 步骤编号
                  - description: 步骤描述
                  - actionType: 操作类型
                  - targetElement: 目标元素信息
                  - parameters: 参数信息
                  - expectedResult: 预期结果
                
                特别注意高德地图3D截图任务，需要包含：
                1. 启动高德地图
                2. 搜索指定地点
                3. 选择地点
                4. 切换到3D模式
                5. 截图保存
            """.trimIndent()
            
            val messages = listOf(
                GLMMessage(role = "system", content = systemPrompt),
                GLMMessage(role = "user", content = "请为这个任务制定详细的执行步骤")
            )
            
            val result = sendMessage(messages, temperature = 0.5)
            result.map { response ->
                response.choices.firstOrNull()?.message?.content ?: ""
            }
        } catch (e: Exception) {
            Result.failure(e)
        }
    }
    
    /**
     * 处理任务异常
     */
    suspend fun handleTaskException(
        taskDescription: String,
        errorMessage: String,
        currentStep: Int
    ): Result<String> {
        return try {
            val systemPrompt = """
                你是一个专业的错误处理助手，专门帮助解决任务执行过程中的异常情况。
                
                当前任务：$taskDescription
                错误信息：$errorMessage
                当前步骤：$currentStep
                
                请分析错误原因并提供解决方案，以JSON格式返回：
                - errorAnalysis: 错误分析
                - possibleCauses: 可能原因列表
                - solutions: 解决方案列表
                - retryStrategy: 重试策略
                - alternativeApproach: 替代方案
            """.trimIndent()
            
            val messages = listOf(
                GLMMessage(role = "system", content = systemPrompt),
                GLMMessage(role = "user", content = "请帮我分析这个错误并提供解决方案")
            )
            
            val result = sendMessage(messages, temperature = 0.3)
            result.map { response ->
                response.choices.firstOrNull()?.message?.content ?: ""
            }
        } catch (e: Exception) {
            Result.failure(e)
        }
    }
}
